#include <ecrantexte.h>
#include <memoire.h>

EcranTexte::EcranTexte()
{
  int i;

  this->abcisseCurseur = 0;
  this->ordonneeCurseur = 0;

  for(i=0;i<(80*25*2);i+=2)
  {
    contenuEcran[i] = ' ';
    contenuEcran[i+1] = (unsigned char)0xF0;
  }
}

void EcranTexte::Ecrire(char* texte)
{
  int idelementcontenu = abcisseCurseur*2 + ordonneeCurseur*160;
  char c;

  c = *texte;
  while(c != '\0')
  {
    if(c == '\n')
    {
      abcisseCurseur = 0;
      ordonneeCurseur++;
      idelementcontenu = abcisseCurseur*2 + ordonneeCurseur*160;
    }
    else
    {
      contenuEcran[idelementcontenu] = (unsigned char)c;
      idelementcontenu += 2;
    }

    c = *(++texte);

    if(abcisseCurseur >= 80)
    {
      abcisseCurseur = 0;
      ordonneeCurseur++;
    }
    while(ordonneeCurseur >= 25)
    {
      MonterDUneLigne();
    }
  }
}

void EcranTexte::MonterDUneLigne()
{
  ordonneeCurseur--;
  CopierBlocMemoire((void*)(0xB8000+160), (void*)0xB8000, 80*2*24);
  EffacerLigne(24);
}

void EcranTexte::EffacerLigne(int ligne)
{
  int i;

  for(i=ligne*160;i<(ligne+1)*160;i+=2)
  {
    contenuEcran[i] = ' ';
  }
}

void EcranTexte::AfficherSurEcranReel()
{
  CopierBlocMemoire((void*)contenuEcran, (void*)0xB8000, 80*25*2);
}

/***************************************/

int TestEcranTexte::Test()
{
  int testreussi = 1;

  if(EcritureDUneChaineSimple() == 0)
  {
    CopierBlocMemoire((void*)"E c r i t u r e   d ' u n   c a r a c t e r e   r a t e e ", (void*)(0xB8000 + 160), 58);
    testreussi = 0;
  }
  else if(EcritureDUneChaineAvecPassageALaLigne() == 0)
  {
    CopierBlocMemoire((void*)"E c h e c   d e   l ' e c r i t u r e   d ' u n e   c h a i n e   a v e c   p a s s a g e   a   l a   l i g n e ", (void*)(0xB8000 + 160), 112);
    testreussi = 0;
  }
  else if(AffichageSurEcranReel() == 0)
  {
    CopierBlocMemoire((void*)"E c h e c   d e   l ' a f f i c h a g e   s u r   e c r a n   r e e l ", (void*)(0xB8000+160), 70);
    testreussi = 0;
  }

  return testreussi;
}

int TestEcranTexte::EcritureDUneChaineSimple()
{
  int testreussi = 1;
  char* chaine = "Texte de test";
  int i;

  Ecrire(chaine);

  for(i=0;i<13;i++)
  {
    if(contenuEcran[i*2] != chaine[i])
    {
      testreussi = 0;
    }
  }

  return testreussi;
}

int TestEcranTexte::EcritureDUneChaineAvecPassageALaLigne()
{
  abcisseCurseur = 0;
  ordonneeCurseur = 0;

  Ecrire("\nab\nc");

  if(contenuEcran[160] != 'a' || contenuEcran[162] != 'b' || contenuEcran[320] != 'c')
  {
    return 0;
  }
  else
  {
    return 1;
  }
}

int TestEcranTexte::AffichageSurEcranReel()
{
  unsigned char* ecranreel = (unsigned char*)0xB8000;

  AfficherSurEcranReel();

  if(ecranreel[4] != contenuEcran[4] || ecranreel[67] != contenuEcran[67] || ecranreel[3400] != contenuEcran[3400])
  {
    return 0;
  }
  else
  {
    return 1;
  }
}
